/*******************************************************************************
** 文件名称：nz3801.h
** 文件作用：NZ3801操作
** 编写作者：Tom Free 付瑞彪
** 编写时间：2019-11-08
** 文件备注：
**			 
**           
** 更新记录：
**          2019-11-08 -> 创建文件                          <Tom Free 付瑞彪>
**
**
**       Copyright (c) 深圳市三派智能科技有限公司 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/
#ifndef __NZ3801_H__
#define __NZ3801_H__

/* NZ3801命令字 */
#define PCD_IDLE                    0x00    /* 取消当前命令 */
#define PCD_MEM                     0x01    /* 存储25字节到内部buf */
#define PCD_GENERATEID              0x02    /* 生成10字节随机ID */
#define PCD_CALCCRC                 0x03    /* CRC计算 */
#define PCD_TRANSMIT                0x04    /* 发送数据 */
#define PCD_NOCMDCHANGE             0x07    /*  */
#define PCD_RECEIVE                 0x08    /* 接收数据 */
#define PCD_TRANSCEIVE              0x0C    /* 发送并接收数据 */
#define PCD_AUTHENT                 0x0E    /* 验证密钥 */
#define PCD_SOFTRESET               0x0F    /* 复位 */

/* Mifare_One卡片命令字 */
#define PICC_REQIDL                 0x26    /* 寻天线区内未进入休眠状态 */
#define PICC_REQALL                 0x52    /* 寻天线区内全部卡 */
#define PICC_ANTICOLL1              0x93    /* 防冲撞 */
#define PICC_ANTICOLL2              0x95    /* 防冲撞 */
#define PICC_AUTHENT1A              0x60    /* 验证A密钥 */
#define PICC_AUTHENT1B              0x61    /* 验证B密钥 */
#define PICC_READ                   0x30    /* 读块 */
#define PICC_WRITE                  0xA0    /* 写块 */
#define PICC_DECREMENT              0xC0    /* 扣款 */
#define PICC_INCREMENT              0xC1    /* 充值 */
#define PICC_RESTORE                0xC2    /* 调块数据到缓冲区 */
#define PICC_TRANSFER               0xB0    /* 保存缓冲区中数据 */
#define PICC_HALT                   0x50    /* 休眠 */
#define PICC_RESET                  0xE0    /* 复位 */

/* NZ3801寄存器定义 */
/* PAGE 0 */
#define RFU00                       0x00
#define CommandReg                  0x01
#define ComIEnReg                   0x02
#define DivlEnReg                   0x03
#define ComIrqReg                   0x04
#define DivIrqReg                   0x05
#define ErrorReg                    0x06
#define Status1Reg                  0x07
#define Status2Reg                  0x08
#define FIFODataReg                 0x09
#define FIFOLevelReg                0x0A
#define WaterLevelReg               0x0B
#define ControlReg                  0x0C
#define BitFramingReg               0x0D
#define CollReg                     0x0E
#define RFU0F                       0x0F
/* PAGE 1 */
#define RFU10                       0x10
#define ModeReg                     0x11
#define TxModeReg                   0x12
#define RxModeReg                   0x13
#define TxControlReg                0x14
#define TxAutoReg                   0x15
#define TxSelReg                    0x16
#define RxSelReg                    0x17
#define RxThresholdReg              0x18
#define DemodReg                    0x19
#define RFU1A                       0x1A
#define RFU1B                       0x1B
#define MifareReg                   0x1C
#define RFU1D                       0x1D
#define RFU1E                       0x1E
#define SerialSpeedReg              0x1F
/* PAGE 2 */
#define RFU20                       0x20
#define CRCResultRegM               0x21
#define CRCResultRegL               0x22
#define RFU23                       0x23
#define ModWidthReg                 0x24
#define RFU25                       0x25
#define RFCfgReg                    0x26
#define GsNReg                      0x27
#define CWGsCfgReg                  0x28
#define ModGsCfgReg                 0x29
#define TModeReg                    0x2A
#define TPrescalerReg               0x2B
#define TReloadRegH                 0x2C
#define TReloadRegL                 0x2D
#define TCounterValueRegH           0x2E
#define TCounterValueRegL           0x2F
/* PAGE 3 */
#define RFU30                       0x30
#define TestSel1Reg                 0x31
#define TestSel2Reg                 0x32
#define TestPinEnReg                0x33
#define TestPinValueReg             0x34
#define TestBusReg                  0x35
#define AutoTestReg                 0x36
#define VersionReg                  0x37
#define AnalogTestReg               0x38
#define TestDAC1Reg                 0x39
#define TestDAC2Reg                 0x3A
#define TestADCReg                  0x3B
#define RFU3C                       0x3C
#define RFU3D                       0x3D
#define RFU3E                       0x3E
#define RFU3F		                0x3F

/* 和NZ3801通讯时返回的错误代码 */
#define MI_OK                       0x00
#define MI_NOTAGERR                 0xFE
#define MI_ERR                      0xFD

/*******************************************************************************
** 函数名称：NZ3801_Init
** 函数作用：初始化端口
** 输入参数：无
** 输出参数：无
** 使用范例：NZ3801_Init();
** 函数备注：
*******************************************************************************/
void NZ3801_Init();

/*******************************************************************************
** 函数名称：NZ3801_AntennaOn
** 函数作用：开启天线
** 输入参数：无
** 输出参数：无
** 使用范例：NZ3801_AntennaOn();
** 函数备注：
*******************************************************************************/
void NZ3801_AntennaOn();

/*******************************************************************************
** 函数名称：NZ3801_AntennaOff
** 函数作用：关闭天线
** 输入参数：无
** 输出参数：无
** 使用范例：NZ3801_AntennaOff();
** 函数备注：
*******************************************************************************/
void NZ3801_AntennaOff();

/*******************************************************************************
** 函数名称：NZ3801_Reset
** 函数作用：复位
** 输入参数：无
** 输出参数：是否OK
** 使用范例：NZ3801_Reset();
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Reset();

/*******************************************************************************
** 函数名称：NZ3801_Request
** 函数作用：寻卡
** 输入参数：req_code - 寻卡方式，pTagType - 卡类型
** 输出参数：是否OK
** 使用范例：NZ3801_Request(PICC_REQIDL, &type);
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Request(uint8_t req_code, uint8_t *pTagType);

/*******************************************************************************
** 函数名称：NZ3801_Anticoll
** 函数作用：防冲撞
** 输入参数：pSnr - 卡序列号
** 输出参数：是否OK
** 使用范例：NZ3801_Anticoll(&snr);
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Anticoll(uint8_t *pSnr);

/*******************************************************************************
** 函数名称：NZ3801_Select
** 函数作用：选定卡片
** 输入参数：pSnr - 卡序列号
** 输出参数：是否OK
** 使用范例：NZ3801_Select(&snr);
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Select(uint8_t *pSnr);

/*******************************************************************************
** 函数名称：NZ3801_AuthState
** 函数作用：验证卡片密码
** 输入参数：auth_mode - 密码验证模式，0x60 - 验证A密钥，0x61 - 验证B密钥
**           block - 块地址
**           pKey - 密码
**           pSnr - 卡序列号
** 输出参数：是否OK
** 使用范例：NZ3801_AuthState(0x60, 2, &key, &snr);
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_AuthState(uint8_t auth_mode, uint8_t block, uint8_t *pKey, uint8_t *pSnr);

/*******************************************************************************
** 函数名称：NZ3801_Read
** 函数作用：读取卡片数据
** 输入参数：block - 块地址
**           pData - 数据地址，长度16字节
** 输出参数：是否OK
** 使用范例：NZ3801_Read(10, &data);
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Read(uint8_t block, uint8_t *pData);

/*******************************************************************************
** 函数名称：NZ3801_Write
** 函数作用：写卡片数据
** 输入参数：block - 块地址
**           pData - 数据地址，长度16字节
** 输出参数：是否OK
** 使用范例：NZ3801_Write(10, &data);
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Write(uint8_t block, uint8_t *pData);

/*******************************************************************************
** 函数名称：NZ3801_Halt
** 函数作用：进入休眠
** 输入参数：无
** 输出参数：是否OK
** 使用范例：NZ3801_Halt();
** 函数备注：
*******************************************************************************/
uint8_t NZ3801_Halt();

#endif  /* __NZ3801_H__ */
